﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using PMSGSC.BLL;
using PMSGSC.DAL;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Localization;

namespace PMSGSC.App
{
    public partial class frmLocation : DevExpress.XtraEditors.XtraForm
    {
        public frmLocation()
        {
            InitializeComponent();
            locationBindingSource.DataSource = Location_BLL.GetAll(frmMain.ship.Ship_ID);
        }
        // Khai báo trạng thái mặc định 
        private Status status = Status.Update;
        // Tạo một đối tượng lưu trữ các thông tin trên View ==> truyền xuống các layer bên dưới
        private Location location = new Location();
        //Hiển thị số thứ tự của gridview
        private void gridView1_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e)
        {
            if (e.RowHandle >= 0)
            {
                e.Info.DisplayText = (e.RowHandle + 1).ToString();
            }
        }
        // Sự kiện cập nhật dữ liệu xuống databse
        private void gridView1_RowUpdated(object sender, DevExpress.XtraGrid.Views.Base.RowObjectEventArgs e)
        {
            SaveDataToDatabase();
        }

        private void SaveDataToDatabase()
        {
            location = locationBindingSource.Current as Location;
            if (status == Status.Update)
            {
                if (XtraMessageBox.Show("Do you want to save changes?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    bool result = Location_BLL.Update(location);
                    if (!result)
                        XtraMessageBox.Show("Update Unsuccess !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    else
                        XtraMessageBox.Show("Update Success !", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    
                }
                locationBindingSource.DataSource = Location_BLL.GetAll(frmMain.ship.Ship_ID);
            }
            if (status == Status.New)
            {
                bool result = Location_BLL.Insert(location);
                if (!result)
                {
                    XtraMessageBox.Show("Insert Unsuccess!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                status = Status.Update;
            }
        }
        private void DeleteLocation(NavigatorButtonClickEventArgs e)
        {
            DeleteLocationFinal();
            e.Handled = true;   
        }

        private void DeleteLocationFinal()
        {
            if (XtraMessageBox.Show("Are you sure you want to delete a Location?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
            {
                location = locationBindingSource.Current as Location;

                if (Location_BLL.IsRelationship(location))
                    Location_BLL.Delete(location);
                else
                    XtraMessageBox.Show("Can't Delete", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

                locationBindingSource.DataSource = Location_BLL.GetAll(frmMain.ship.Ship_ID);
            }
        }

        // Sự kiện nhân phím delete sảy ra
        private void gridView1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                DeleteLocationFinal();
            }
        }
        // Khởi tạo giá trị mặc định của ô cần ràng buộc
        private void gridView1_InitNewRow(object sender, DevExpress.XtraGrid.Views.Grid.InitNewRowEventArgs e)
        {
            status = Status.New;
        }
        // Kiểm tra ràng buộc của dữ liệu người dùng nhập vào
        private void gridView1_ValidateRow(object sender, DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e)
        {
            GridView view = (GridView)sender;
            GridColumn LocationCodeCol = view.Columns["CodeLocation"];
            GridColumn LocationNameCol = view.Columns["NameLocation"];

            if (null == view.GetRowCellValue(e.RowHandle, LocationCodeCol))
            {
                e.Valid = false;
                view.FocusedColumn = view.Columns["CodeLocation"];
                e.ErrorText = "Please enter the Location Code. ";
                view.SetColumnError(LocationCodeCol, "Location Code cannot be empty");
                return;
            }
            if (null == view.GetRowCellValue(e.RowHandle, LocationNameCol))
            {
                e.Valid = false;
                view.FocusedColumn = LocationNameCol;
                e.ErrorText = "Please enter the Location Code. ";
                view.SetColumnError(LocationNameCol, "Location Code cannot be empty");
                return;
            }

            location = locationBindingSource.Current as Location;
            location.Ship_ID = frmMain.ship.Ship_ID;

            if (Location_BLL.IsExits(location))
            {
                e.Valid = false;
                view.FocusedColumn = view.Columns["CodeLocation"];
                e.ErrorText = "Location Code has existed. ";
                view.SetColumnError(LocationCodeCol, "Location Code has existed");
                return;
            }

        }

        // Thông báo lỗi nếu dữ liệu nhập vào không đúng
        private void gridView1_InvalidRowException(object sender, DevExpress.XtraGrid.Views.Base.InvalidRowExceptionEventArgs e)
        {
            if (e.RowHandle == GridControl.NewItemRowHandle)
            {
                e.WindowCaption = "Input Error";
            }
            else
            {
                e.ExceptionMode = DevExpress.XtraEditors.Controls.ExceptionMode.NoAction;
                DialogResult dr = XtraMessageBox.Show(gridControl1.LookAndFeel, this, e.ErrorText + GridLocalizer.Active.GetLocalizedString(GridStringId.ColumnViewExceptionMessage), e.WindowCaption, MessageBoxButtons.YesNo, MessageBoxIcon.Error);
                if (dr == DialogResult.No)
                {
                    e.ExceptionMode = DevExpress.XtraEditors.Controls.ExceptionMode.Ignore;
                    locationBindingSource.DataSource = Location_BLL.GetAll(frmMain.ship.Ship_ID);
                    status = Status.Update;
                }
            }

        }
        // Đặt lại trạng thái update 
        private void gridView1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
        {
            if (e.RowHandle != GridControl.NewItemRowHandle)
            {
                status = Status.Update;
            }
        }

        private void gridControl1_EmbeddedNavigator_ButtonClick(object sender, NavigatorButtonClickEventArgs e)
        {
            switch (e.Button.ButtonType)
            {
                case NavigatorButtonType.Remove:
                    DeleteLocation(e);
                    break;
            }
        }
    }
}